<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>再论继承</title>
</head>
<body>
    <script>
        /*JS中的继承是基于原型链的，也就意味着子类只能继承原型对象的属性和方法
          
          JS中万物皆对象，所以函数也是个对象也就意味着可以为函数上绑定函数的属性
          函数上绑定的函数和属性只能通过函数名.函数()的形式调用，就算子类的prototype属性
          指向该函数也无法调用 因为这个函数是定义在函数上的 子类只能继承this内的属性和父类定义在原型上的属性
        */

        function Person(name,age){
            /**
             * 函数内部既然使用this一般来说是将函数当做构造函数来使用
             * this为创建的对象
            */
            this.name = name;
            this.age = age;
            /**
             * 其实构造函数内部的函数最好定义在原型上
            */
            this.ownFunction = function(){
                console.log("ownFunction[可以被继承的方法]");
            }

            Person.fxx = function(){
                console.log("fxx[类方法]");
            }
        }

        Person.prototype.gxx=function(){
            console.log("gxx原型中的方法");
        }


        function Student(name,age,score){
            Person.call(this,name,age);
            this.score = score;
        }

        Student.prototype =new Person();
        Student.prototype.constructor =Student;


        let person =new Person();
        console.log(person);
        Person.fxx();//类方法只能通过类名调用
        // Person.gxx();
        /**函数原型中的方法是不能通过类名调用的，
        因为这里的Person是一个函数对象，Person内部的函数不能调用因为作用域，
        Person原型中的调用不到，因为它是一个函数对象作用域链__proto__是function类型的 */
  
        // 想要通过函数对象调用函数原型中的方法要这样调用
        Person.prototype.gxx();

        let student = new Student();

        student.ownFunction();
        student.gxx();
        // student.fxx(); 子类无法继承父类中的类方法


    </script>
</body>
</html>